package br.jus.cnj;

import java.util.InputMismatchException;

import javax.swing.text.MaskFormatter;

public class CNPJUtils {

	/**
	 * <p>
	 * Remove mascara do CNPJ
	 * </p>
	 * 
	 * @param cnpj
	 *            com mascara.
	 * @return <code>00000000000000</code> - CNPJ sem mascara
	 */
	public static final String removeMascaraCNPJ(String cnpj) {
		return StringUtils.somenteNumero(cnpj);
	}

	/**
	 * <p>
	 * Adiciona formatacao ao CNPJ.
	 * </p>
	 * 
	 * @param cnpj
	 *            sem mascara.
	 * @return <code>00.000.000/0000-00</code> - CNPJ com mascara.
	 */
	public static String inserirMascaraCNPJ(String cnpj) throws Exception {
		if (cnpj != null && !"".equals(cnpj)) {
			MaskFormatter mf = new MaskFormatter("##.###.###/####-##");
			mf.setValueContainsLiteralCharacters(false);
			cnpj = mf.valueToString(cnpj);
		}
		return cnpj;
	}

	/**
	 * <p>
	 * Verifica se o CPF e valido.
	 * </p>
	 * 
	 * <pre>
	 * CNPJUtils.isCNPJValido("00000000000000")      = false
	 * CNPJUtils.isCNPJValido("11111111111111")      = false
	 * CNPJUtils.isCNPJValido("22222222222222")      = false
	 * CNPJUtils.isCNPJValido("33333333333333")      = false
	 * CNPJUtils.isCNPJValido("44444444444444")      = false
	 * CNPJUtils.isCNPJValido("55555555555555")      = false
	 * CNPJUtils.isCNPJValido("66666666666666")      = false
	 * CNPJUtils.isCNPJValido("77777777777777")      = false
	 * CNPJUtils.isCNPJValido("88888888888888")      = false
	 * CNPJUtils.isCNPJValido("99999999999999")      = false
	 * </pre>
	 * 
	 * @param CNPJ
	 *            com ou sem mascara.
	 * @return <code>true</code> se o CNPJ for valido.
	 */

	public static boolean isCNPJValido(String CNPJ) {
		CNPJ = removeMascaraCNPJ(CNPJ);
		if (CNPJ.equals("00000000000000") || CNPJ.equals("11111111111111") || CNPJ.equals("22222222222222") || CNPJ.equals("33333333333333") || CNPJ.equals("44444444444444")
				|| CNPJ.equals("55555555555555") || CNPJ.equals("66666666666666") || CNPJ.equals("77777777777777") || CNPJ.equals("88888888888888")
				|| CNPJ.equals("99999999999999") || (CNPJ.length() != 14) || CNPJ.equals(""))
			return (false);

		char digitoCNPJ13, digitoCNPJ14;
		int sm, i, r, num, peso;

		try {
			sm = 0;
			peso = 2;
			for (i = 11; i >= 0; i--) {
				num = (int) (CNPJ.charAt(i) - 48);
				sm = sm + (num * peso);
				peso = peso + 1;
				if (peso == 10)
					peso = 2;
			}

			r = sm % 11;
			if ((r == 0) || (r == 1))
				digitoCNPJ13 = '0';
			else
				digitoCNPJ13 = (char) ((11 - r) + 48);

			sm = 0;
			peso = 2;
			for (i = 12; i >= 0; i--) {
				num = (int) (CNPJ.charAt(i) - 48);
				sm = sm + (num * peso);
				peso = peso + 1;
				if (peso == 10)
					peso = 2;
			}

			r = sm % 11;
			if ((r == 0) || (r == 1))
				digitoCNPJ14 = '0';
			else
				digitoCNPJ14 = (char) ((11 - r) + 48);

			if ((digitoCNPJ13 == CNPJ.charAt(12)) && (digitoCNPJ14 == CNPJ.charAt(13)))
				return (true);
			else
				return (false);
		} catch (InputMismatchException erro) {
			return (false);
		}
	}

	// public static void main(String[] args) throws Exception {
	// System.out.println(isCPFValido("00000000000"));
	// }

}
